From: Ray Strode Date: Mon, 15 Jul 2019 17:52:58 +0000 (-0400) Subject: appDisplay: Don't leak duplicate items in AppView X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~839^2^2~147 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=eaa32090b9;p=gnome-shell.git appDisplay: Don't leak duplicate items in AppView If an icon already exists in an app view with the same id, the duplicate is not added on a call to addItem. Unfortunately, since it's not added, the icon actor gets orphaned and leaked. This commit address the problem by introducing a new hasItem method and disallowing callers to call addItem with a duplicate in the first place. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 8bfdd1707..cd7a23e96 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -128,10 +128,14 @@ class BaseAppView { return this._allItems; } + hasItem(id) { + return this._items[id] !== undefined; + } + addItem(icon) { let id = icon.id; - if (this._items[id] !== undefined) - return; + if (this.hasItem(id)) + throw new Error(`icon with id ${id} already added to view`) this._allItems.push(icon); this._items[id] = icon; @@ -371,6 +375,8 @@ var AllView = class AllView extends BaseAppView { let folders = this._folderSettings.get_strv('folder-children'); folders.forEach(id => { + if (this.hasItem(id)) + return; let path = this._folderSettings.path + 'folders/' + id + '/'; let icon = new FolderIcon(id, path, this); icon.connect('name-changed', this._itemNameChanged.bind(this)); @@ -1151,6 +1157,9 @@ var FolderIcon = class FolderIcon { let excludedApps = this._folder.get_strv('excluded-apps'); let appSys = Shell.AppSystem.get_default(); let addAppId = appId => { + if (this.view.hasItem(appId)) + return; + if (excludedApps.includes(appId)) return;